1. Field
The present invention pertains to the creation of software; more particularly, the present invention pertains to the creation of individual software products that are part of a software product family using a software production line.
2. Background
A software product family is a collection of almost-alike individual software products, each of which individual software product has some unique features and some common features found in all of the individual software products within the software product family. Software product families are typically created to satisfy a common need shared by many customers or market segments while at the same time accommodating the unique requirements of individual customers or market segments for a specially tailored individual software product.
Most software development organizations have a need to create and maintain multiple nearly-identical software systems. For example, a mobile phone manufacturer may have to produce hundreds of individual variations of the software which operates its handsets, one software variation for each handset model and wireless service provider used by the handset. Although most of the software for the hundreds of combinations of handsets and wireless service providers is virtually identical, each individual software product has small, but extremely important, variations which enable the operation of different handset features with the different features offered by the available array of wireless service providers.
Conventional approaches to developing individual software products have focused on creating and maintaining a one-of-a-kind software product rather than creating a family of nearly identical software products. Accordingly, the use of conventional approaches to create software product families including nearly-identical, but individualized, software products has been costly, slow, and often prone to errors.
One approach to reducing cost, speeding up the process of software creation, and reducing errors in the creation of software product families is the process of software mass customization. The process of software mass customization focuses on the means for efficiently producing and maintaining multiple similar software products, exploiting what the multiple similar software products have in common, and managing the differences among the individual software products. A better understanding of the process of software mass customization can be had by making an analogy to the automotive industry. In the automotive industry, the manufacturing of automobiles focuses on the use of a single production line to produce multiple similar variations of a particular car model. The powerful, though subtle, essence of this analogy to the production of multiple similar cars is the focus on a singular means of production for software rather than focusing on the creation of many similar individual software products. Once a process of software mass customization has been established, the actual production of the individual software products is more a matter of automated instantiation to create multiple individual software products efficiently rather than making the many small programming language changes associated with the manual creation of each individual software product in a software product family.
Actual success stories of the use of software mass customization techniques exist in such diverse areas as the software used with mobile phones, e-commerce, computer printers, diesel engines, telecom networks, enterprise software, cars, ships, and airplanes. The software system associated with each one of these examples relies on creating and maintaining a collection of individual but similar software products. By using the process of software mass customization to exploit what their individual software products have in common and to effectively manage the variation between their various software programs, companies have seen the potential for major reductions in time-to-market, engineering overhead and error rates in the creation of new almost-alike individual software products.
Many of the companies who have had success with the use of software mass customization techniques have also reported that the process of software mass customization continues to present formidable technical challenges. Accordingly, the complexity associated with the process of software mass customization results in large adoption times and efforts for establishing new software production lines.
Newcomers to the process of software mass customization often believe that the process involves simply building a single software system and then building a collection of small variations within the single software system using tools and techniques developed for the creation of special use software products. To date, however, no formal tools or techniques for building and managing a large and diverse collection of small variations in the individual software products in a software product family have been developed.
One attempt to solving the problem of building and managing a collection of small variations for a software product line includes the reliance on informally contrived solutions such as preprocessors, naming conventions, directory structure conventions, configuration files, build directives, assembly scripts, install scripts, and parallel configuration management branches. It has been found, however, that these informally contrived solutions are not scalable; specifically, they are not manageable beyond a small number of software product variations. Moreover, these informal solutions are code-level mechanisms that are poorly suited for the expression of product-level constraints.
The problem remains, therefore, to create a robust system and method for the creation of individual software products in a software product family. The desired system and method must provide for the building and managing of a large collection of small variations among a group of individual software products within the software product family. The desired system and method should also minimize technical complexity, maximize reuse of existing software, present a low cost to the software developer, be easy to adopt, and enable the rapid production of individual software products that are part of a software product family.